home *** CD-ROM | disk | FTP | other *** search
/ PC User 2003 January / Disc 3 / Amethyst.iso / live / lib / hotplug / hotplug-usb < prev    next >
Encoding:
Text File  |  2002-11-04  |  3.0 KB  |  110 lines

  1. #!/usr/bin/perl
  2. # handle plugging in usb modules
  3. #TYPE=0/0/0
  4. #ACTION=add
  5. #DEVFS=/proc/bus/usb
  6. #DEVICE=/proc/bus/usb/001/013
  7. #INTERFACE=255/0/0
  8. #PRODUCT=5a9/a511/100
  9.  
  10. $uname=`uname -r`;chomp($uname);
  11.  
  12. if (!$ENV{'TYPE'} || !$ENV{'PRODUCT'}) {
  13.     logit("ERROR: Those suckers changed the kernel interface _AGAIN_!\n");
  14.     die;
  15. }
  16.  
  17. ($intclass,$intsubclass,$intproto) = split(/\//,$ENV{'TYPE'});
  18. ($vendor,$product,$revision) = split(/\//,$ENV{'PRODUCT'});
  19.  
  20. if (!defined($revision) || !defined($intproto)) {
  21.     logit("ERROR: Those suckers changed the kernel interface _AGAIN_!\n");
  22.     die;
  23. }
  24.  
  25. $intclass    = oct "0x$intclass";
  26. $intsubclass    = oct "0x$intsubclass";
  27. $intproto    = oct "0x$intproto";
  28. $vendor        = oct "0x$vendor";
  29. $product    = oct "0x$product";
  30. $revision    = oct "0x$revision";
  31.  
  32. logit("interface: $intclass/$intsubclass/$intproto, v: $vendor, p: $product, rev $revision\n");
  33.  
  34. %loaded = ();
  35.  
  36. if ($ENV{'ACTION'} eq 'add') {
  37.     if (!open(USBMAP,"/lib/modules/$uname/modules.usbmap")) {
  38.         logit("could not open USBMAP:$!\n");
  39.         exit 0;
  40.     }
  41.     # # module             idVendor idProduct bcdDevice_lo bcdDevice_hi bDeviceClass bDeviceSubClass bDeviceProtocol bInterfaceClass bInterfaceSubClass bInterfaceProtocol driver_info
  42.  
  43.     $vars = <USBMAP>;chomp($vars);
  44.     $vars =~ s/^# //;
  45.     $vars =~ s/^usb //;
  46.     @vars = split(/\s+/,$vars);
  47.     for ($i=0;$i<@vars;$i++) { $vi{$vars[$i]} = $i; }
  48.     foreach ('match_flags','idVendor','idProduct','bDeviceClass','bDeviceSubClass','bDeviceProtocol','bInterfaceClass','bInterfaceSubClass','bInterfaceProtocol') {
  49.         logit("ERROR: $_ missing\n") unless (defined($vi{$_}));
  50.     }
  51.     while (<USBMAP>) {
  52.         print STDERR;
  53.         chomp;
  54.         @vals = split;
  55.         $module        =     $vals[$vi{'module'}];
  56.  
  57.         next if ($loaded{$module});
  58.  
  59.         $match_flags    = oct $vals[$vi{'match_flags'}];
  60.         $xvendor    = oct $vals[$vi{'idVendor'}];
  61.         $xproduct    = oct $vals[$vi{'idProduct'}];
  62.         $bdevclass    = oct $vals[$vi{'bDeviceClass'}];
  63.         $bdevsubclass    = oct $vals[$vi{'bDeviceSubClass'}];
  64.         $bdevproto    = oct $vals[$vi{'bDeviceProtocol'}];
  65.         $bintclass    = oct $vals[$vi{'bInterfaceClass'}];
  66.         $bintsubclass    = oct $vals[$vi{'bInterfaceSubClass'}];
  67.         $bintproto    = oct $vals[$vi{'bInterfaceProtocol'}];
  68.  
  69.         if ($xvendor) {
  70.             if (($xvendor==$vendor) && ($xproduct==$product)) {
  71.                 logit("loading module $module");
  72.                 system("/sbin/modprobe -k $module");
  73.                 $loaded{$module} = 1;
  74.             }
  75.         } else {
  76.             if (($bdevclass == $intclass)    &&
  77.                 (!$bdevsubclass || ($intsubclass==$bdevsubclass)) &&
  78.                 (!$bdevproto || ($intproto == $bdevproto))
  79.             ) {
  80.                 logit("loading module $module");
  81.                 system("/sbin/modprobe -k $module");
  82.                 $loaded{$module} = 1;
  83.             }
  84.  
  85.             if (($bintclass == $intclass)    &&
  86.                 (!$bintsubclass || ($intsubclass==$bintsubclass)) &&
  87.                 (!$bintproto || ($intproto == $bintproto))
  88.             ) {
  89.                 logit("loading module $module");
  90.                 system("/sbin/modprobe -k $module");
  91.                 $loaded{$module} = 1;
  92.             }
  93.         }
  94.     }
  95.     close(USBMAP);
  96. }
  97.  
  98. system("/opt/redmondlinux/bin/rlhwrescan");
  99.  
  100. exit 0;
  101.  
  102. sub logit {
  103.     my($logline) = @_;
  104.  
  105.     # is not writeable on bootup
  106.     open(VARLOG,">>/var/log/hotplug")||return;
  107.     print VARLOG $logline . "\n";
  108.     close(VARLOG);
  109. }
  110.